package com.vortex.cloud.zhsw.xinyang.util;

import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.math.NumberUtils;

import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;

public class BigDecimalValidator {

    private static final Pattern PATTERN_NUMBER = Pattern.compile("\\d");

    public static void main(String[] args) {
        // 示例数据
        BigDecimal number = new BigDecimal("123456789.12345");

        // 校验整数部分和小数部分的长度
        validateBigDecimal(number, 10, 5); // 假设整数部分最大长度为10，小数部分最大长度为5
    }

    public static String validateBigDecimal(BigDecimal number, int maxIntegerLength, int maxFractionLength) {
        if (number == null) {
            throw new IllegalArgumentException("Number cannot be null");
        }

        // 获取整数部分
        BigDecimal integerPart = number.setScale(0, BigDecimal.ROUND_DOWN);
        String integerPartStr = integerPart.toPlainString();

        // 获取小数部分
        BigDecimal fractionPart = number.subtract(integerPart);
        String fractionPartStr = fractionPart.stripTrailingZeros().toPlainString();

        // 计算整数部分的长度
        int integerLength = integerPartStr.length();

        // 计算小数部分的长度（不包括小数点）
        int fractionLength = fractionPartStr.indexOf('.') != -1 ? fractionPartStr.length() - fractionPartStr.indexOf('.') - 1 : 0;

        // 校验整数部分长度
        if (integerLength > maxIntegerLength) {
            return "整数位允许最大长度为: " + maxIntegerLength;
        }

        // 校验小数部分长度
        if (fractionLength > maxFractionLength) {
            return "小数位允许最大长度为: " + maxIntegerLength;
        }

        return null;
    }

    public static Long convertLong(List<String> messages, String sourceValueStr, Long min, Long max) {
        Long integerValue = NumberUtils.toLong(sourceValueStr);
        if (!Objects.equals(integerValue.toString(), sourceValueStr)) {
            messages.add("必须为整型数字格式");
            return null;
        } else {
            if ((long)integerValue < min) {
                messages.add("不能小于" + min);
            }

            if ((long)integerValue > max) {
                messages.add("不能大于" + max);
            }

            return integerValue;
        }
    }

    public static BigDecimal convertDecimal(List<String> messages, String sourceValueStr, Integer length, Integer precision, Integer min, Integer max) {
        if (!NumberUtils.isCreatable(sourceValueStr)) {
            messages.add("必须为数字格式");
            return null;
        } else {
            BigDecimal bigDecimalValue = NumberUtils.createBigDecimal(sourceValueStr);
            String bigDecimalValuePlainString = bigDecimalValue.toPlainString();
            if (Objects.nonNull(length) && length > 0) {
                int numberCount = ReUtil.count(PATTERN_NUMBER, bigDecimalValuePlainString);
                if (numberCount > length) {
                    messages.add("所有数字位数不能超过" + length);
                }
            }

            if (Objects.nonNull(precision) && precision > 0) {
                String decimalPart = StrUtil.subAfter(bigDecimalValuePlainString, ".", true);
                if (decimalPart.length() > precision) {
                    messages.add("小数位数不能超过" + precision + "位");
                }
            }
            if (bigDecimalValue.doubleValue() < min) {
                messages.add("不能小于" + min);
            }

            if (bigDecimalValue.doubleValue() > max) {
                messages.add("不能大于" + max);
            }
            return bigDecimalValue;
        }
    }
}
